#include <iostream>
#include <cstdio>
#include <vector>
#include <functional>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if (id == 0)
    {
        sleep(2);
        printf("hello bit\n");
        printf("hello bit\n");
        printf("hello bit\n");
        printf("hello bit\n");
        printf("hello bit\n");
        int a = 10;
        a /= 0;
        printf("hello bit\n");

        exit(1);
    }
    int status = 0;
    waitpid(id, &status, 0);
    printf("signal: %d, exit code: %d, core dump: %d\n",
           (status & 0x7F), (status >> 8) & 0xFF, (status >> 7) & 0x1);
}

// int main()
// {
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
//     int a = 10;
//     a /= 0;
//     // raise(2);
//     printf("hello bit\n");
//     printf("hello bit\n");
//     printf("hello bit\n");
// }


// void PrintPending(sigset_t &pending)
// {
//     printf("我是一个进程(%d), pending: ", getpid());
//     for (int signo = 31; signo >= 1; signo--)
//     {
//         if (sigismember(&pending, signo))
//         {
//             std::cout << "1";
//         }
//         else
//         {
//             std::cout << "0";
//         }
//     }
//     std::cout << std::endl;
// }

// void handler(int sig)
// {
//     std::cout << "抵达二号信号" <<std::endl;
// }

// int main()
// {
//     signal(SIGINT, handler);
//     sigset_t block, oblock;
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     //sigaddset(&block, SIGINT);
//     for(int i = 1; i < 32; i++)
//     {
//         sigaddset(&block, i);
//     }
//     int n = sigprocmask(SIG_SETMASK, &block, &oblock);
//     (void)n;

//     int cnt = 0;

//     while (true)
//     {
//         sigset_t pending;
//         int m = sigpending(&pending);

//         PrintPending(pending);
//         if(cnt == 10)
//         {
//             sigprocmask(SIG_SETMASK, &oblock, nullptr);
//             std::cout << "解除对2号的屏蔽" << std::endl;
//         }
//         sleep(1);
//         cnt++;
//     }

//     return 0;
// }

// void handlerSig(int sig)
// {
//     std::cout << "获得了一个信号: " << sig << std::endl;
//     exit(13);
// }

// int main()
// {
//     for(int i = 0; i < 32; i++)
//         signal(i, handlerSig);
//     alarm(1);
//     int cnt = 0;
//     while(true)
//     {
//         std::cout << "count: " << cnt++ << std::endl;
//     }
//     return 0;
// }